from sqlalchemy.orm import Session

from common.Exception import PPTStateUpdateError, PPTNotExistError
from pojo.ppt import PPT
from utils.log import logger


def get_ppt_by_name(db, pptx_name):
    """
    通过ppt_name拿到ppt
    :param db:数据库连接池
    :param pptx_name: ppt名称
    :return: ppt对象
    """
    try:
        ppt = db.query(PPT).filter(PPT.ppt_name == pptx_name).first()
        if ppt:
            return ppt
        else:
            raise PPTNotExistError(pptx_name)
    except Exception as e:
        db.rollback()  # 出现异常时回滚事务
        logger.info(f"查找PPT失败: {e}")
        return None

def get_ppt_by_id(db, ppt_id):
    """
    通过ppt_name拿到ppt
    :param db:数据库连接池
    :param pptx_name: ppt名称
    :return: ppt对象
    """
    try:
        ppt = db.query(PPT).filter(PPT.ppt_id == ppt_id).first()
        return ppt
    except Exception as e:
        db.rollback()  # 出现异常时回滚事务
        logger.info(f"查找PPT失败: {e}")
        return None
def update_ppt_state(db: Session, ppt_id, ppt_state):
    """
    通过pptID修改ppt状态
    :param ppt_state: ppt状态
    :param db: 数据库连接池
    :param ppt_id: ppt唯一标识
    :return: 修改成功
    """
    try:
        ppt_obj = db.query(PPT).filter(PPT.ppt_id == ppt_id).first()
        if ppt_obj:
            ppt_obj.ppt_state = ppt_state
            db.commit()
            db.refresh(ppt_obj)
            return ppt_obj
        else:
            raise PPTStateUpdateError(ppt_id, ppt_state)
    except Exception as e:
        db.rollback()
        logger.info(f"错误原因：{e}")
        raise e  # 重新抛出原始异常（会继续触发全局异常处理器）
def add_ppt(db: Session, ppt: PPT):
    """
    向PPT表中插入一行数据
    :param db: 数据库连接池
    :param ppt:PPT对象
    :return: 插入成功的PPT对象
    """
    db.add(ppt)
    db.commit()
    db.refresh(ppt)
    return ppt


def update_ppt_fields(db: Session, ppt_id, update_data: dict):
    """
    通用方法：根据传入字段动态更新PPT记录
    :param db: SQLAlchemy Session
    :param ppt_id: 要更新的PPT ID
    :param update_data: 包含要更新字段的字典
    :return: 更新后的PPT对象
    """
    try:
        ppt_obj = db.query(PPT).filter(PPT.ppt_id == ppt_id).first()
        if not ppt_obj:
            raise PPTNotExistError(ppt_id)
        for key, value in update_data.items():
            if hasattr(ppt_obj, key):
                setattr(ppt_obj, key, value)  # 动态赋值

        db.commit()
        db.refresh(ppt_obj)
        return ppt_obj

    except Exception as e:
        db.rollback()
        logger.info(f"错误原因：{e}")
        raise e